package com.android.model.net;

import com.android.app.constant.UrlConstants;
import com.android.model.entity.res.AccountInfoResult;
import com.android.model.entity.res.AccountTokenResult;
import com.android.model.entity.res.CreateSessionResult;
import com.android.model.entity.res.CreateTicketResult;
import com.android.model.entity.res.CreateTokenResult;
import com.android.model.entity.res.LoginResult;
import com.android.model.entity.res.OrderCompletedResult;
import com.android.model.entity.res.OrderResult;
import com.android.model.entity.res.SendCodeResult;
import com.android.model.entity.res.SetTradePWDVerifyResult;
import com.android.model.entity.res.SymbolListResult;
import com.android.model.entity.res.TradePWDVerifyResult;
import com.android.model.entity.res.UserInfoResult;
import com.android.model.entity.res.UserVerifierResult;
import com.android.model.entity.res.VerifyCodeResult;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import retrofit2.Response;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;

/**
 * author:  TenFace
 * date:    2017/9/14
 * description: retrofit的请求接口定义
 */

public interface ApiService {

    @POST(UrlConstants.USER_SEND)
    Observable<SendCodeResult> sendSmsCode(@Body Map<String, String> map);

    @POST(UrlConstants.USER_CODE_VERIFY)
    Observable<VerifyCodeResult> verifyCode(@Body Map<String, String> map);

    @POST(UrlConstants.USER_REGISTER)
    Observable<Response<Void>> getRegisterStatus(@Header("token") String header, @Body Map<String, String> map);

    @POST(UrlConstants.USER_LOGIN)
    Observable<LoginResult> getLoginStatus(@Body Map<String, String> map);

    @POST(UrlConstants.USER_VERIFY)
    Observable<UserVerifierResult> getUserVerify(@Body Map<String, String> map);

    @POST(UrlConstants.USER_RESET)
    Observable<Response<Void>> resetAccountPassword(@Header("token") String header, @Body Map<String, String> map);

    @POST(UrlConstants.USER_QUERY_INFO)
    Observable<UserInfoResult> getUserInfo(@Header("token") String header);

    @POST(UrlConstants.USER_SET_TRADE_PWD_VERIFY)
    Observable<SetTradePWDVerifyResult> verifySetTradePassword(@Header("token") String header, @Body Map<String, String> map);

    @POST(UrlConstants.USER_SET_TRADE_PWD)
    Observable<Response<Void>> setTradePassword(@Header("token") String header, @Body Map<String, String> map);

    @POST(UrlConstants.USER_TRADE_PWD_VERIFY)
    Observable<TradePWDVerifyResult> verifyTradePassword(@Header("token") String header, @Body Map<String, String> map);

    @GET(UrlConstants.TRADE_SYMBOL_LIST)
    Observable<List<SymbolListResult>> getSymbolList();

    @POST
    Observable<AccountTokenResult> createAccountToken(@Body Map<String, String> map, @Url String url);

    @POST
    Observable<CreateTokenResult> createToken(@Body Map<String, String> map, @Url String url);

    @POST
    Observable<CreateSessionResult> createSession(@Body Map<String, String> map, @Url String url);

    @GET
    Observable<AccountInfoResult> queryAccountInfo(@Url String url);


    @FormUrlEncoded
    @POST
    Observable<CreateTicketResult> createTicket(@FieldMap Map<String, String> map, @Url String url);

    @POST
    Observable<OrderResult> createNewOrder(@Body Map<String, Object> map, @Url String url);

    @POST
    Observable<OrderResult> cancelOrder(@Body Map<String, String> map, @Url String url);

    @GET
    Observable<OrderCompletedResult> getListCompletedOrder(@Url String url, @QueryMap Map<String, Object> map);

    @GET
    Observable<List<OrderResult>> getListOpenOrder(@Url String url, @Query("accountId") String accountId);


//    //请求参数逐个传入
//    @FormUrlEncoded
//    @POST("请求地址")
//    Observable<SendCodeResult> getInfo(@Field("token") String token, @Field("id") int id);
//
//    //请求参数一次性传入（通过Map来存放参数名和参数值）
//    @FormUrlEncoded
//    @POST("请求地址")
//    Observable<SendCodeResult> getInfo(@FieldMap Map<String, String> map);
//
//    //上传单个文本和单个文件（如果报错，可以尝试把@Query换成@Field或@Part）
//    @Multipart
//    @POST("请求地址")
//    Observable<SendCodeResult> upLoadTextAndFile(@Query("textKey") String text,
//                                             @Part("fileKey\"; filename=\"test.png") RequestBody fileBody);
//
//    //上传多个文本和多个文件（如果报错，可以尝试把@QueryMap换成@FieldMap或@PartMap）
//    @Multipart
//    @POST("请求地址")
//    Observable<SendCodeResult> upLoadTextsAndFiles(@QueryMap Map<String, String> textMap,
//                                               @PartMap Map<String, RequestBody> fileBodyMap);
//
//    //下载大文件时，请加上@Streaming，否则容易出现IO异常
//    @Streaming
//    @GET
//    Observable<ResponseBody> downloadFile(@Url String downloadUrl);

}
